#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef double ElemSet; /* 物品重量和价值均为实数 */
#define eps (1e-9)
typedef struct ObjNode *Objects;
struct ObjNode {
    ElemSet w; /* 重量 */
    ElemSet v; /* 价值 */
};
ElemSet opt_value;
int *opt;

ElemSet Max(ElemSet x, ElemSet y) {
    return (x > y) ? x : y;
}

/* 算法15-13：离散背包问题的递归分治解法 Knapsack01( W, s, x, f, n, i ) */
ElemSet Knapsack01(ElemSet W, Objects s, int *x, ElemSet f, int n, int i) {
    ElemSet take_it, drop_it;
    int j;

    if (i >= n || W < eps) { /* 如果s[]已经处理完，或背包已满 */
        if (f > opt_value) { /* 当前整体可行解更优，则更新最优解 */
            opt_value = f;
            for (j = 0; j < n; j++) {
                opt[j] = x[j];
            }
        }
        return 0.0; /* 空集子问题的最优解为0.0 */
    } else if (s[i].w <= W) { /*  s[i]有可能被放进背包 */
        x[i] = 1; /* 放入，并计算最优结果 */
        take_it = s[i].v + Knapsack01(W - s[i].w, s, x, f + s[i].v, n, i + 1);
        x[i] = 0; /* 舍弃，并计算最优结果 */
        drop_it = Knapsack01(W, s, x, f, n, i + 1);
        return Max(take_it, drop_it); /* 返回两种选择中较好的解 */
    } else { /* s[i]太重，不能放进背包 */
        x[i] = 0; /* 舍弃，递归处理剩下的问题 */
        return Knapsack01(W, s, x, f, n, i + 1);
    }
}
/* 算法15-13 结束 */

int main(void) {
    Objects s;
    ElemSet W;
    int *x;
    int n, i;

    scanf("%d %lf", &n, &W);
    s = (Objects)malloc(sizeof(struct ObjNode) * n);
    x = (int *)malloc(sizeof(int) * n);
    memset(x, 0, sizeof(int) * n);
    opt = (int *)malloc(sizeof(int) * n);
    memset(opt, 0, sizeof(int) * n);
    for (i = 0; i < n; i++) {
        scanf("%lf", &s[i].w);
    }
    for (i = 0; i < n; i++) {
        scanf("%lf", &s[i].v);
    }
    opt_value = 0.0;
    printf("%.2f\n", Knapsack01(W, s, x, 0.0, n, 0));
    for (i = 0; i < n; i++) {
        printf("%d ", opt[i]);
    }
    return 0;
}